package nl.tudelft.jpacman.npc.ghost;

import nl.tudelft.jpacman.board.Direction;
import nl.tudelft.jpacman.board.Square;
import nl.tudelft.jpacman.board.Unit;
import nl.tudelft.jpacman.npc.Ghost;  // 确保正确定义Ghost接口

import java.util.List;
import java.util.Optional;
import java.util.ArrayList;
import java.util.Collections;

/**
 * 导航辅助类，提供幽灵移动相关的实用方法。
 */
public final class Navigation {

    /**
     * 查找最近的指定类型单位。
     */
    public static <T extends Unit> T findNearest(Class<T> type, Square current) {
        // 实现保持不变...
    }

    /**
     * 计算两个方格之间的曼哈顿距离。
     */
    public static int getDistance(Square from, Square to) {
        // 实现保持不变...
    }

    /**
     * 计算最短路径。
     * @param from 起始位置
     * @param to 目标位置
     * @param ghost 移动的幽灵
     * @return 路径方向列表
     */
    public static List<Direction> shortestPath(Square from, Square to, Ghost ghost) {
        if (from == null || to == null || ghost == null) {
            return Collections.emptyList();
        }

        // 简化实现 - 实际项目可能需要A*算法
        List<Direction> path = new ArrayList<>();
        int dx = to.getX() - from.getX();
        int dy = to.getY() - from.getY();

        if (dx > 0) {
            path.add(Direction.EAST);
        } else if (dx < 0) {
            path.add(Direction.WEST);
        }

        if (dy > 0) {
            path.add(Direction.SOUTH);
        } else if (dy < 0) {
            path.add(Direction.NORTH);
        }

        return path;
    }

    /**
     * 随机选择一个可移动方向。
     * @param ghost 要移动的幽灵
     * @return 可能包含移动方向的Optional
     */
    public static Optional<Direction> randomMove(Ghost ghost) {
        if (ghost == null) {
            return Optional.empty();
        }

        List<Direction> moves = new ArrayList<>();
        for (Direction dir : Direction.values()) {
            if (ghost.canMove(dir)) {
                moves.add(dir);
            }
        }

        return moves.isEmpty() ?
            Optional.empty() :
            Optional.of(moves.get((int)(Math.random() * moves.size())));
    }
}
